﻿namespace GenericDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");


            CommonMethod.Show(1);
            CommonMethod.Show("Hello, World!");
            CommonMethod.ShowObject(1);
            CommonMethod.ShoeGeneric<string>("Hello World!");


            //二、泛型的声明--设计思想
            //代码在底层执行的时候  必须要明确清楚是什么类型的；计算器执行的都是机器码
            //延迟声明：声明时不确定类型，调用确定类型

            //三、泛型的特点+原理
            //.Net Framework 2.0支持
            //泛型在编译后：变成一个带有~符号
            Console.WriteLine(typeof(List<>));
            Console.WriteLine(typeof(Dictionary<,>));

            //泛型类~   一个类满足不同类型的需求  为每一个不同的类型生成一个唯一的副本
            GenericClass<int> intClass = new GenericClass<int>();
            GenericClass<string> stringClass = new GenericClass<string>();
            GenericClass<DateTime> dateTimeClassClass = new GenericClass<DateTime>();

            //泛型接口~   一个接口满足不同类型的需求
            IGenericInterface<int> genericInterface1 = new MyClass<int>();//泛型接口
            IGenericInterface<string> genericInterface2 = new MyClass<string>();//泛型接口
            IGenericInterface<DateTime> genericInterface3 = new MyClass<DateTime>();//泛型接口

            //泛型委托  一个委托满足不同类型的需求
            CustomAction<int> action1 = S => { };
            CustomAction<string> action2 = S=> { };
            CustomAction<DateTime> action3 = S=> { };


            {
                //泛型约束
                People people = new People()
                {   
                    Id = 123,
                    Name = "老师",
                };


                Chinese chinese = new Chinese()
                {
                    Id = 111,
                    Name = "XIAOMING"
                };



                //这就是典型的类型不安全问题：-----》泛型来解决
                //OBJECT作为参数  所有类型都可以传入
                //可能会因为一些不合适的类型传入 导致一些问题
                GenericConstraint.ShowObject(people); 
                GenericConstraint.ShowGeneric<People>(people);
                GenericConstraint.ShowGeneric(chinese);
                GenericConstraint.ShowGeneric1(chinese);

            }

            Console.ReadKey();
        }


    }
}
